/**
 * HTTP响应标准化工具
 * 兼容 null/空体/Blob/JSON包裹等多种响应格式
 */

/**
 * 标准化axios响应
 * @param {Object} response - axios响应对象
 * @returns {*} 标准化后的数据
 */
export function normalizeResponse(response) {
  // 检查HTTP状态码
  if (!response || typeof response.status !== 'number') {
    throw new Error('Invalid response object')
  }

  const { status, data, headers = {}, request = {} } = response

  // 非2xx状态码直接抛错
  if (status < 200 || status >= 300) {
    throw new Error(`HTTP ${status}`)
  }

  // 1. 处理空体情况：204状态码、Content-Length为0、data为null或空字符串
  if (
    status === 204 ||
    headers['content-length'] === '0' ||
    data === null ||
    (data === '' && !isJsonContentType(headers['content-type']))
  ) {
    return null
  }

  // 2. 处理二进制数据：Blob、ArrayBuffer等
  if (
    request.responseType === 'blob' ||
    data instanceof Blob ||
    data instanceof ArrayBuffer ||
    data instanceof Uint8Array
  ) {
    return data
  }

  // 3. 处理JSON包裹格式：{code, msg/message, data}
  if (data && typeof data === 'object' && !Array.isArray(data)) {
    // 检查是否为标准业务响应格式
    if (hasBusinessWrapper(data)) {
      const { code, msg, message, data: businessData } = data
      
      // 成功的业务状态码
      if (isSuccessCode(code)) {
        return businessData ?? null
      }
      
      // 失败的业务状态码
      const errorMsg = msg || message || '业务失败'
      throw new Error(errorMsg)
    }
  }

  // 4. 其他情况：直接返回data（原生JSON、字符串、数组等）
  return data
}

/**
 * 标准化axios错误
 * @param {Error} error - axios错误对象
 * @returns {Error} 标准化后的错误
 */
export function normalizeAxiosError(error) {
  if (!error) {
    return new Error('Unknown error')
  }

  // 已经是标准化的错误
  if (error.message && !error.response && !error.request) {
    return error
  }

  const { response, request, message, config } = error
  let errorMessage = 'Network error'
  let statusCode = null
  let url = config?.url || 'unknown'

  if (response) {
    // 服务器响应错误
    statusCode = response.status
    errorMessage = `HTTP ${statusCode}`
    
    // 尝试从响应体获取错误信息
    if (response.data) {
      if (typeof response.data === 'string') {
        errorMessage += `: ${response.data}`
      } else if (response.data.msg || response.data.message) {
        errorMessage += `: ${response.data.msg || response.data.message}`
      }
    }
  } else if (request) {
    // 请求发送失败
    errorMessage = 'Network request failed'
  } else {
    // 其他错误
    errorMessage = message || 'Unknown error'
  }

  const normalizedError = new Error(errorMessage)
  normalizedError.status = statusCode
  normalizedError.url = url
  
  return normalizedError
}

/**
 * 检查Content-Type是否为JSON
 * @param {string} contentType 
 * @returns {boolean}
 */
function isJsonContentType(contentType) {
  return contentType && contentType.toLowerCase().includes('application/json')
}

/**
 * 检查响应是否包含业务包装器
 * @param {*} data 
 * @returns {boolean}
 */
function hasBusinessWrapper(data) {
  return (
    data &&
    typeof data === 'object' &&
    ('code' in data) &&
    ('msg' in data || 'message' in data || 'data' in data)
  )
}

/**
 * 检查业务状态码是否表示成功
 * @param {*} code 
 * @returns {boolean}
 */
function isSuccessCode(code) {
  // 支持多种成功状态码格式
  return (
    code === 0 ||
    code === '0' ||
    code === 200 ||
    code === '200' ||
    code === 200000 ||
    code === '200000' ||
    code === 'SUCCESS'
  )
}
